/**
 * 日誌工具類
 * 統一管理日誌輸出，根據環境控制調試信息
 */

import { currentEnv } from '../src/config/env'

// 日誌級別
export enum LogLevel {
  DEBUG = 'debug',
  INFO = 'info',
  WARN = 'warn',
  ERROR = 'error'
}

// 日誌配置
const LOG_CONFIG = {
  development: {
    enableDebug: true,
    enableInfo: true,
    enableWarn: true,
    enableError: true
  },
  production: {
    enableDebug: false,
    enableInfo: false,
    enableWarn: true,
    enableError: true
  },
  test: {
    enableDebug: true,
    enableInfo: true,
    enableWarn: true,
    enableError: true
  }
}

class Logger {
  private config = LOG_CONFIG[currentEnv]

  /**
   * 調試日誌
   */
  debug(message: string, ...args: any[]): void {
    if (this.config.enableDebug) {
      console.log(`[DEBUG] ${message}`, ...args)
    }
  }

  /**
   * 信息日誌
   */
  info(message: string, ...args: any[]): void {
    if (this.config.enableInfo) {
      console.log(`[INFO] ${message}`, ...args)
    }
  }

  /**
   * 警告日誌
   */
  warn(message: string, ...args: any[]): void {
    if (this.config.enableWarn) {
      console.warn(`[WARN] ${message}`, ...args)
    }
  }

  /**
   * 錯誤日誌
   */
  error(message: string, ...args: any[]): void {
    if (this.config.enableError) {
      console.error(`[ERROR] ${message}`, ...args)
    }
  }

  /**
   * 條件日誌（根據條件決定是否輸出）
   */
  conditional(condition: boolean, message: string, ...args: any[]): void {
    if (condition && this.config.enableDebug) {
      console.log(`[COND] ${message}`, ...args)
    }
  }

  /**
   * 性能日誌
   */
  performance(label: string, fn: () => any): any {
    if (this.config.enableDebug) {
      console.time(label)
      const result = fn()
      console.timeEnd(label)
      return result
    } else {
      return fn()
    }
  }

  /**
   * 組日誌
   */
  group(label: string, fn: () => void): void {
    if (this.config.enableDebug) {
      console.group(label)
      fn()
      console.groupEnd()
    } else {
      fn()
    }
  }
}

// 創建全局實例
export const logger = new Logger()

// 導出便捷方法
export const { debug, info, warn, error, conditional, performance, group } = logger
